/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.runtime.config.spring.parsers.delegate;

import org.mule.runtime.config.spring.parsers.MuleDefinitionParser;
import org.mule.runtime.config.spring.parsers.MuleDefinitionParserConfiguration;
import org.mule.runtime.config.spring.parsers.PostProcessor;
import org.mule.runtime.config.spring.parsers.PreProcessor;
import org.mule.runtime.config.spring.parsers.assembly.configuration.ValueMap;

import java.util.Map;

import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

/**
 * Support for extending a {@link org.mule.runtime.config.spring.parsers.MuleDefinitionParser} without needing to subclass.
 */
public abstract class AbstractPluggableDelegate implements MuleDefinitionParser {

  private MuleDefinitionParser delegate;

  public AbstractPluggableDelegate(MuleDefinitionParser delegate) {
    this.delegate = delegate;
  }

  public AbstractBeanDefinition muleParse(Element element, ParserContext parserContext) {
    return delegate.muleParse(element, parserContext);
  }

  public MuleDefinitionParserConfiguration registerPreProcessor(PreProcessor preProcessor) {
    delegate.registerPreProcessor(preProcessor);
    return this;
  }

  public MuleDefinitionParserConfiguration registerPostProcessor(PostProcessor postProcessor) {
    delegate.registerPostProcessor(postProcessor);
    return this;
  }

  public MuleDefinitionParserConfiguration addReference(String propertyName) {
    delegate.addReference(propertyName);
    return this;
  }

  public MuleDefinitionParserConfiguration addMapping(String propertyName, Map mappings) {
    delegate.addMapping(propertyName, mappings);
    return this;
  }

  public MuleDefinitionParserConfiguration addMapping(String propertyName, String mappings) {
    delegate.addMapping(propertyName, mappings);
    return this;
  }

  public MuleDefinitionParserConfiguration addMapping(String propertyName, ValueMap mappings) {
    delegate.addMapping(propertyName, mappings);
    return this;
  }

  public MuleDefinitionParserConfiguration addAlias(String alias, String propertyName) {
    delegate.addAlias(alias, propertyName);
    return this;
  }

  public MuleDefinitionParserConfiguration addCollection(String propertyName) {
    delegate.addCollection(propertyName);
    return this;
  }

  public MuleDefinitionParserConfiguration addIgnored(String propertyName) {
    delegate.addIgnored(propertyName);
    return this;
  }

  public MuleDefinitionParserConfiguration removeIgnored(String propertyName) {
    delegate.removeIgnored(propertyName);
    return this;
  }

  public MuleDefinitionParserConfiguration setIgnoredDefault(boolean ignoreAll) {
    delegate.setIgnoredDefault(ignoreAll);
    return this;
  }
}
